[アップデート] AWS AppConfig にコンテキストに基づいてフラグ値を分けることができるマルチバリアントフラグが登場したので Lambda から使ってみた

[アップデート] AWS AppConfig にコンテキストに基づいてフラグ値を分けることができるマルチバリアントフラグが登場したので Lambda から使ってみた

Clock Icon2024.07.24

いわさです。

AWS でフィーチャーフラグを導入したい場合は AWS AppConfig を使うことが出来ます。
アプリや環境別に構成やフラグのデプロイ管理が出来るので非常に便利ではありますが、一方で複数パターンのフラグを組み合わせたい場合はその数だけフラグのパターンか環境を用意してアプリケーションで切り替えるなど、ちょっと面倒なケースがありました。

本日のアップデートで AppConfig に対するリクエストコンテキスト情報に基づいてルールベースで複数の値を切り替える仕組みが導入されました。

https://aws.amazon.com/about-aws/whats-new/2024/07/aws-appconfig-feature-flag-targets-variants-splits/

例えばマルチテナントで特定テナントへのみプレビュー機能を提供するとか、一定割合のトラフィックに対してのみフラグを有効化するとか、コードで頑張らずにフィーチャーフラグを管理するクラウドサービス側でうまいことやってくれというケースにも対応出来そうです。

マルチバリアントフラグの設定方法

まずは通常どおりアプリケーションと設定プロファイルを新しく作成し、機能フラグを設定していきましょう。

6F58169A-B68C-4359-94DE-0D2A20B4A87A

で、従来どおり設定プロファイル作成時にフラグを設定するのですが、実は今回のアップデートのマルチバリアントフラグはこのタイミングではまだ作成が出来ません。
なので、まだこの時点ではデフォルトのフラグ値のみを設定しておくようにしましょう。

72A7D35F-ED1D-46E0-9B88-3E471030C823

そして作成後に機能フラグの編集を行います。

83CA0752-E8A6-4DD1-A6FE-0A3A6F3BD2B3

ここで初めて、バリアントという概念があり、従来の基本フラグに加えてマルチバリアントフラグとして選択が出来ることが確認出来ます。

4D74DD88-EFD0-43BA-82F1-2909F278FC13

そしてここでマルチバリアントフラグを選択すると、次のようにバリアントを複数設定出来るようになります。
最初はデフォルトのみです。

FDBB547C-7279-4023-9886-4F063E0AB8BB

マルチバリアントフラグの時にバリアントを新しく追加しようとすると、次のようにそのバリアントを提供する条件が設定出来ます。

F7D8E952-12B9-4630-8656-D20C11451111

設定方法に最初悩むところなのですが、次のメニューにルールブループリントというテンプレートみたいなものが用意されているので、ここをベースに作成すると良いです。

1932D2F2-C2E8-4245-AB6E-C89B3BF0CBF0

今回はバリアントルールをこんな感じで設定してみました。
ルールビルダーでバリアントが適用される条件を視覚的に確認出来ます。
ゼロから作成しようとすると悩みましたが、ブループリントを選択してそこから変更する形を取っていくと始めやすいと思います。

6FD076C8-1420-4072-8DBF-CC1DCACCE34F

このルールですが、ルールビルダーで視覚的に確認・設定も出来ますが、エディタで柔軟な設定も可能です。

9F030398-714B-43F1-A7D0-0649751D4266

ルール内で使える演算子などは次の公式ドキュメントにも記述されています。

https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-multi-variant-feature-flags.html

ちなみにマルチバリアントフラグについては設定プロファイルの一覧上は次のような表示となります。
この画面で直接 ON/OFF が出来ないのでコンテキストメニューから編集が必要となりますので覚えておきましょう。

FBC03D9F-8397-49F3-A4B3-A1EF9F91703A

マルチバリアントフラグ構成後は通常と同じ流れで AppConfig 環境へデプロイしましょう。

30D8FF57-CC20-4437-975F-E175B15B7449

マルチバリアントフラグの取得方法

ここまででマルチバリアントフラグを作成し環境へデプロイすることが出来ました。
続いてアプリケーションからこの機能フラグを使ってみましょう。

AppConfig のバリアントは AppConfig Agent 経由で取得することが出来ます。今回のアップデートでエージェント側もマルチバリアントに対応しているので、アップデートを行いましょう。

この記事では Lambda でバリアントを取得してみたいと思います。

Lambda レイヤーの構成して取得する

まずは基本的な AppConfig 拡張の構成を行います。
流れとしては Lambda レイヤーを構成し、アプリケーションは localhost にリクエストを送信する形となります。

後述しますが Lambda レイヤーは本日時点では ARN で直接しておきましょう。マネジメントコンソールから選択する場合は古いバージョンが選択されたためです。

BCFEE9C0-6C85-4E94-ACC9-7D8A9CC5E122

リージョンごとの ARN はこちらから取得してください。

https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-integration-lambda-extensions-versions.html#appconfig-integration-lambda-extensions-enabling-x86-64

今回は Python 3.12 ランタイムを使っています。
公式ドキュメントからのほぼ引用となりますが、次のようにリクエストを送信します。URL 内にアプリケーションや環境など私の環境固有の情報が含まれています。

import urllib.request

def lambda_handler(event, context):
    url = f'http://localhost:2772/applications/hoge0724config/environments/hoge0724env/configurations/hoge0724profile1?flag=hoge-flag1'
    config = urllib.request.urlopen(url).read()
    return config

実行してみると、デフォルトのフラグがまずは取得されましたね。

36EBAEFB-2F24-43B6-ABF2-D7F8275833B5_4_5005_c

マルチバリアントのためのコンテキストを設定

マルチバリアントの取得方法はこちらの公式ドキュメントにも詳しく記載されています。

https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-integration-retrieving-feature-flags.html

要はリクエストヘッダーでコンテキストを設定すれば良いようです。
今回であれば次のようにuserIdを渡してみます。

import urllib.request

def lambda_handler(event, context):
    url = f'http://localhost:2772/applications/hoge0724config/environments/hoge0724env/configurations/hoge0724profile1?flag=hoge-flag1'
    req = urllib.request.Request(url)
    req.add_header('Context', 'userId=123456789012')
    # config = urllib.request.urlopen(url).read()
    config = urllib.request.urlopen(req).read()
    return config

実行してみましょう。どうかな...

896E1DE0-164F-4162-A5F9-BE9EACA8CAEC

おお、コンテキスト情報がバリアントのルールに一致したため、特定バリアントが取得されました。いいですね。
ちなみにコンテキスト情報を含むが、ルールに該当しない場合は次のようにデフォルト値が取得されました。こちらも期待どおり。

AA9694BC-0182-47F8-8F91-C88145EA8A92

Lambda レイヤーの古いバージョンでは機能しない

本日時点ではマネジメントコンソールから選択する際の AWS-AppConfig-Extension のバージョンは 104 でした。
一方で先程指定したバージョンは東京リージョンだと 119 です。

777DF8F8-019B-4F27-BE96-BD4C17E0156C

バージョン 104 でも試してみたのですが、この場合はルールに一致するコンテキストが含まれていてもデフォルト値が取得されました。

DD764A3F-3446-45D3-93DF-D212417AE730

マルチバリアントが期待どおり動作しなくなるので、エージェントや Lambda レイヤーのバージョンには注意しましょう。

さいごに

本日は AWS AppConfig にコンテキストに基づいてフラグ値を分けることができるマルチバリアントフラグが登場したので、同時にアップデートされた Lambda レイヤー AWS-AppConfig-Extension を使って取得してみました。

AppConfig 良いなと思いつつ、例えばマルチテナントのプール型などの際にテナントごとの機能フラグを制御したい場合にちょっと大変だなぁと思っていたのですが、コンテキストの基づいてうまいこと動いてくれるこの機能はとても良い気がしますね。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.